This Firebase Cloud Function, using Express.js middleware, provides a remote procedure call (RPC) endpoint that accepts function names from requests, executes them, and returns the results as JSON responses. It also logs the results and handles cookies and CORS.
npm run import -- "google cloud function rpc wrapper"
var cookie = require('cookie');
var cors = require('cors')({origin: true});
var importer = require('../Core');
var getResult = importer.import("rpc result");
var getEnvironment = importer.import("get environment");
var expressToResult = (req, res) => getResult({
command: (req.body || {})['function'] || (req.query || {})['function'],
result: importer.interpret((req.body || {})['function'] || (req.query || {})['function']),
body: req.method === 'POST' ? req.body : req.query,
circles: ['Public']
})
var logResult = (r) => {
// TODO: call storeResult()?
var result = typeof r === 'object'
? Object.keys(r).reduce((alt, key) => {
alt[key] = r[key] + '';
return alt;
}, {})
: ('' + r);
console.log(result);
return result;
}
function expressHandler(req, res) {
getEnvironment();
req.cookies = cookie.parse(req.get('cookie') || '');
res.setHeader('Cache-Control', 'private');
cors(req, res, () => {});
return Promise.resolve()
.then(() => expressToResult(req, res))
.then(r => (res.status(200), r))
.catch(e => (res.status(500), e))
.then(r => logResult(r))
.then(r => res.send(r));
}
module.exports.handler = expressHandler;
const cookie = require('cookie');
const cors = require('cors')({ origin: true });
const { importModule } = require('../Core');
const { getResult, interpret } = importModule(['rpc result', 'get environment']);
const expressToResult = (req, res) => {
const func = req.body?.function || req.query?.function;
const data = req.method === 'POST'? req.body : req.query;
const result = getResult({
command: func,
result: interpret(func),
body: data,
circles: ['Public'],
});
return result;
};
const logResult = (r) => {
let result;
if (typeof r === 'object') {
result = Object.fromEntries(Object.entries(r).map(([key, value]) => [key, value.toString()]));
} else {
result = r.toString();
}
console.log(result);
return result;
};
const expressHandler = (req, res) => {
getEnvironment();
req.cookies = cookie.parse(req.get('cookie') || '');
res.setHeader('Cache-Control', 'private');
cors(req, res, () => {});
return Promise.resolve()
.then(() => expressToResult(req, res))
.then((r) => {
res.status(200);
return r;
})
.catch((e) => {
res.status(500);
return e;
})
.then(logResult)
.then((r) => res.send(r));
};
module.exports.handler = expressHandler;
This code sets up an Express.js middleware function for a Firebase Cloud Function that acts as a remote procedure call (RPC) endpoint.
Here's a breakdown:
Dependencies:
cookie
for parsing cookies, cors
for handling cross-origin requests, and custom modules importer
and getResult
.expressToResult
Function:
getResult
to interpret the function name and execute the corresponding logic.logResult
Function:
storeResult
to persist the result.expressHandler
Function:
Cache-Control
header to private
.expressToResult
to process the request.Export:
expressHandler
function as the Cloud Function's handler.